package system.view;

import java.awt.Event;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;

import javax.swing.JFileChooser;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.KeyStroke;

import system.activity.MainListener;
import system.util.HistoryReader;
import system.util.SettingsUtil;
import user.view.BifocalLensImpl;
import user.view.ElongFocusFocusatorImpl;
import user.view.FocusatorInCrossImpl;
import user.view.FocusatorInLineImpl;
import user.view.FocusatorInRingImpl;
import user.view.FocusatorInSquareShapeImpl;
import user.view.FresnelAnnularImpl;
import user.view.FresnelCrossedImpl;
import user.view.FresnelCylindricalImpl;
import user.view.GHModanImpl;
import user.view.GLModanImpl;
import user.view.PrismImpl;
import user.view.RectangleImpl;
import user.view.ReportPanelImpl;
import user.view.RomeroGratingImpl;

public class MainMenuBar extends JMenuBar
{

	MainListener listener;
	HistoryReader historyReader;

	public MainMenuBar(JLabel status)
	{
		super();
		JMenu menuFile = new JMenu("Файл");
		JMenu menuView = new JMenu("Вид");
		JMenu menuModel = new JMenu("Моделирование");
		JMenu menuComponents = new JMenu("Компоненты");
		menuFile.addMouseListener(new MenuMouseAdapter("Файл", " ", status));
		menuView.addMouseListener(new MenuMouseAdapter("Вид", " ", status));
		menuModel.addMouseListener(new MenuMouseAdapter("Моделирование", " ", status));
		menuComponents.addMouseListener(new MenuMouseAdapter("Выберите необходимое действие", " ", status));
		// File
		JMenuItem itemFileNew = new JMenuItem("Создать отчет");
		itemFileNew.setAccelerator(KeyStroke.getKeyStroke(77, Event.CTRL_MASK));
		itemFileNew.addMouseListener(new MenuMouseAdapter("Добавить Форму создания отчета", " ", status));
		itemFileNew.addActionListener(new ActionListener()
		{
			public void actionPerformed(ActionEvent e)
			{
				new ReportPanelImpl(listener);
			}
		});

		JMenuItem itemFileOpen = new JMenuItem("Открыть элемент");
		itemFileOpen.setAccelerator(KeyStroke.getKeyStroke(79, Event.CTRL_MASK));
		itemFileOpen.addMouseListener(new MenuMouseAdapter("Основное меню программы", " ", status));

		JMenuItem itemFileSave = new JMenuItem("Сохранить элемент");
		itemFileSave.setAccelerator(KeyStroke.getKeyStroke(83, Event.CTRL_MASK));
		itemFileSave.addMouseListener(new MenuMouseAdapter("Основное меню программы", " ", status));
		itemFileSave.addActionListener(new ActionListener()
		{
			public void actionPerformed(ActionEvent e)
			{
				try {
					JFileChooser fileChooser = new JFileChooser();
					if (new File(SettingsUtil.getDefaultFolder()) != null)
						fileChooser.setCurrentDirectory(new File(SettingsUtil.getDefaultFolder()));
					int ret = fileChooser.showDialog(null, "Сохранить элемент");
					if (ret == JFileChooser.APPROVE_OPTION) {
						File file = fileChooser.getSelectedFile();
						HistoryReader.saveDOE(listener.getControlHistoryDescription(), file.getAbsolutePath());
						SettingsUtil.setDefaultFolder(file.getParent());

					}
				} catch (FileNotFoundException ex) {
					// TODO Auto-generated catch block
					ex.printStackTrace();
				} catch (IOException ex) {
					// TODO Auto-generated catch block
					ex.printStackTrace();
				}
			}
		});
		JMenuItem itemFileSaveAs = new JMenuItem("Сохранить как..");
		itemFileSaveAs.setAccelerator(KeyStroke.getKeyStroke(83, Event.SHIFT_MASK));
		itemFileSaveAs.addMouseListener(new MenuMouseAdapter("Основное меню программы", " ", status));
		JMenuItem itemFileClose = new JMenuItem("Зыкрыть все");
		itemFileClose.setAccelerator(KeyStroke.getKeyStroke(67, Event.CTRL_MASK));
		itemFileClose.addMouseListener(new MenuMouseAdapter("Основное меню программы", " ", status));
		
		itemFileClose.addActionListener(new ActionListener()
		{
			public void actionPerformed(ActionEvent e)
			{
				listener.clearAll();
			}
		});
		JMenuItem itemFileExit = new JMenuItem("Выйти");
		itemFileExit.setAccelerator(KeyStroke.getKeyStroke(88, Event.CTRL_MASK));
		itemFileExit.addMouseListener(new MenuMouseAdapter("Основное меню программы", " ", status));

		itemFileExit.addActionListener(new java.awt.event.ActionListener()
		{
			public void actionPerformed(ActionEvent e)
			{
				System.exit(0);
			}
		});

		itemFileOpen.addActionListener(new java.awt.event.ActionListener()
		{
			public void actionPerformed(ActionEvent e)
			{
				try {
					if (historyReader == null) {
						historyReader = new HistoryReader(listener);
					}
					JFileChooser fileChooser = new JFileChooser();
					if (new File(SettingsUtil.getDefaultFolder()) != null)
						fileChooser.setCurrentDirectory(new File(SettingsUtil.getDefaultFolder()));
					int ret = fileChooser.showDialog(null, "Открыть");
					if (ret == JFileChooser.APPROVE_OPTION) {
						File file = fileChooser.getSelectedFile();
						if (file.canRead()) {
							historyReader.readFile(file);
						}
					}
				} catch (Exception ex) {
				}
			}
		});

		menuFile.add(itemFileNew);
		menuFile.addSeparator();
		menuFile.add(itemFileOpen);
		menuFile.add(itemFileSave);
		menuFile.add(itemFileSaveAs);
		menuFile.addSeparator();
		menuFile.add(itemFileClose);
		menuFile.addSeparator();
		menuFile.add(itemFileExit);

		JMenuItem themes = new JMenuItem("Темы");
		themes.addMouseListener(new MenuMouseAdapter("Графические темы", " ", status));

		JMenu menuLaser = new JMenu("Моданы");
		menuLaser.addMouseListener(new MenuMouseAdapter("Выберите один из моданов", " ", status));
		JMenuItem ermitGauss = new JMenuItem("Эрмита-Гаусса");
		JMenuItem lagerrGauss = new JMenuItem("Лагерра-Гаусса");

		ermitGauss.addMouseListener(new MenuMouseAdapter("Модан Эрмита - Гаусса", " ", status));
		lagerrGauss.addMouseListener(new MenuMouseAdapter("Модан Лагерра - Гаусса", " ", status));
		ermitGauss.addActionListener(new ActionListener()
		{
			public void actionPerformed(ActionEvent e)
			{
				new GHModanImpl(listener);
			}
		});
		lagerrGauss.addActionListener(new ActionListener()
		{
			public void actionPerformed(ActionEvent e)
			{
				new GLModanImpl(listener);
			}
		});
		menuLaser.add(ermitGauss);
		menuLaser.add(lagerrGauss);
		// *******************
		JMenu menuLens = new JMenu("Линзы");
		menuLens.addMouseListener(new MenuMouseAdapter("Выберите необходимую линзу", " ", status));
		// ********************
		JMenuItem fresnelAnnular = new JMenuItem("Линза Френеля");
		fresnelAnnular.addMouseListener(new MenuMouseAdapter("Моделирование линзы Френеля", " ", status));
		fresnelAnnular.addActionListener(new ActionListener()
		{
			public void actionPerformed(ActionEvent e)
			{
				new FresnelAnnularImpl(listener);
			}
		});
		menuLens.add(fresnelAnnular);
		// ********************
		JMenuItem cylindricalLens = new JMenuItem("Линза Френеля цилиндрическая");
		cylindricalLens.addMouseListener(new MenuMouseAdapter("Моделирование цилиндрической линзы", " ", status));
		cylindricalLens.addActionListener(new ActionListener()
		{
			public void actionPerformed(ActionEvent e)
			{
				new FresnelCylindricalImpl(listener);
			}
		});
		menuLens.add(cylindricalLens);

		// ********************
		JMenuItem bifocalLens = new JMenuItem("Бифокальная линза");
		bifocalLens.addMouseListener(new MenuMouseAdapter("Моделирование бифокальной линзы", " ", status));
		bifocalLens.addActionListener(new ActionListener()
		{
			public void actionPerformed(ActionEvent e)
			{
				new BifocalLensImpl(listener);
			}
		});
		menuLens.add(bifocalLens);
		// ********************
		JMenuItem crossedAnnular = new JMenuItem("Линзы астигматические скрещенные");
		crossedAnnular.addMouseListener(new MenuMouseAdapter("Моделирование скрещенных астигматических линз", " ", status));
		crossedAnnular.addActionListener(new ActionListener()
		{
			public void actionPerformed(ActionEvent e)
			{
				new FresnelCrossedImpl(listener);
			}
		});
		menuLens.add(crossedAnnular);
		// ********************
		JMenu menuFocusator = new JMenu("Фокусаторы");
		menuFocusator.addMouseListener(new MenuMouseAdapter("Выберите необходимый фокусатор", " ", status));
		// ********************
		JMenuItem ringFocusator = new JMenuItem("Фокусатор в кольцо");
		ringFocusator.addMouseListener(new MenuMouseAdapter("Моделирование фокусатора в кольцо", " ", status));
		ringFocusator.addActionListener(new ActionListener()
		{
			public void actionPerformed(ActionEvent e)
			{
				new FocusatorInRingImpl(listener);
			}
		});
		menuFocusator.add(ringFocusator);
		// ********************
		JMenuItem lineFocusator = new JMenuItem("Фокусатор в линию");
		lineFocusator.addMouseListener(new MenuMouseAdapter("Моделирование фокусатора в линию", " ", status));
		lineFocusator.addActionListener(new ActionListener()
		{
			public void actionPerformed(ActionEvent e)
			{
				new FocusatorInLineImpl(listener);
			}
		});
		menuFocusator.add(lineFocusator);

		// ********************
		JMenuItem crossFocusator = new JMenuItem("Фокусатор в перекрестие");
		crossFocusator.addMouseListener(new MenuMouseAdapter("Моделирование фокусатора в перекрестие", " ", status));
		crossFocusator.addActionListener(new ActionListener()
		{
			public void actionPerformed(ActionEvent e)
			{
				new FocusatorInCrossImpl(listener);
			}
		});
		menuFocusator.add(crossFocusator);
		// ********************
		JMenuItem squareFocusator = new JMenuItem("Фокусатор в квадратный контур");
		squareFocusator.addMouseListener(new MenuMouseAdapter("Моделирование фокусатора в квадратный контур", " ", status));
		squareFocusator.addActionListener(new ActionListener()
		{
			public void actionPerformed(ActionEvent e)
			{
				new FocusatorInSquareShapeImpl(listener);
			}
		});
		menuFocusator.add(squareFocusator);
		// ********************
		JMenuItem elongFocusFocusator = new JMenuItem("Фокусатор в продольную линию");
		elongFocusFocusator.addMouseListener(new MenuMouseAdapter("Моделирование фокусатора в продольную линзу", " ", status));
		elongFocusFocusator.addActionListener(new ActionListener()
		{
			public void actionPerformed(ActionEvent e)
			{
				new ElongFocusFocusatorImpl(listener);
			}
		});
		menuFocusator.add(elongFocusFocusator);
		// ********************
		JMenuItem rectangleFocusator = new JMenuItem("Фокусатор в квадрат");
		rectangleFocusator.addMouseListener(new MenuMouseAdapter("Моделирование фокусатора в квадрат", " ", status));
		rectangleFocusator.addActionListener(new ActionListener()
		{
			public void actionPerformed(ActionEvent e)
			{
				new RectangleImpl(listener);
			}
		});
		menuFocusator.add(rectangleFocusator);

		// ********************

		JMenuItem menuPrism = new JMenuItem("Призма");
		elongFocusFocusator.addMouseListener(new MenuMouseAdapter("Моделирование призмы", " ", status));
		menuPrism.addActionListener(new ActionListener()
		{
			public void actionPerformed(ActionEvent e)
			{
				new PrismImpl(listener);
			}
		});
		
		//*******
		
		JMenuItem beamSplitter = new JMenuItem("Делитель пучка Ромеро-Дикки");
		elongFocusFocusator.addMouseListener(new MenuMouseAdapter("Моделирование пучка Ромеро-Дикки", " ", status));
		beamSplitter.addActionListener(new ActionListener()
		{
			public void actionPerformed(ActionEvent e)
			{
				new RomeroGratingImpl(listener);
			}
		});

		menuView.add(themes);
		menuModel.add(menuLaser);
		menuModel.add(menuLens);
		menuModel.add(menuFocusator);
		menuModel.add(menuPrism);
		menuModel.add(beamSplitter);
		
		JMenu menuAddComponents = new JMenu("Добавить");
		menuAddComponents.addMouseListener(new MenuMouseAdapter("Добавить графический компонент", " ", status));
		JMenuItem addReportMenu = new JMenuItem("Форма создания отчета");
		addReportMenu.addMouseListener(new MenuMouseAdapter("Добавить Форму создания отчета", " ", status));
		addReportMenu.addActionListener(new ActionListener()
		{
			public void actionPerformed(ActionEvent e)
			{
				new ReportPanelImpl(listener);
			}
		});
		menuAddComponents.add(addReportMenu);
		menuComponents.add(menuAddComponents);
		this.add(menuFile);
		this.add(menuView);
		this.add(menuModel);
		this.add(menuComponents);
	}

	public void setListener(MainListener listener)
	{
		this.listener = listener;
	}

}
